package com.study.others;

import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;

import org.junit.Test;

/**
* @Name: SequenceInputStreamDemo
* @Description: 合并字节流测试类
* 说明：
* 	SequenceInputStream 表示其他输入流的逻辑串联。它从输入流的有序集合开始，并从第一个输入流开始读取，直到到达文件末尾，接着从第二个输入流读取，
* 						依次类推，直到到达包含的最后一个输入流的文件末尾为止。 
* 继承关系：
* 	|-InputStream
* 		|-SequenceInputStream
* 构造：
* 	SequenceInputStream(InputStream s1, InputStream s2) 
* 		 通过记住这两个参数来初始化新创建的 SequenceInputStream（将按顺序读取这两个参数，先读取 s1，然后读取 s2），以提供从此 SequenceInputStream 读取的字节。
* 	SequenceInputStream(Enumeration<? extends InputStream> e) 
* 		通过记住参数来初始化新创建的 SequenceInputStream，该参数必须是生成运行时类型为 InputStream 对象的 Enumeration 型参数。
* 		而Enumeration类型是Vector集合中elements()方法的返回值
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-1-16 下午10:10:45 
* @Version: V1.0
 */
public class SequenceInputStreamDemo {
	
	/**
	* @Name: test01
	* @Description: 测试一：合并两个输入流
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-16 下午10:13:50
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void test01() throws IOException {
		//创建文件字节输入流1
		InputStream is01 = new FileInputStream("标准流.txt") ;
		//创建文件字节输入流2
		InputStream is02 = new FileInputStream("打印流.txt") ;
		//将输入流1和2合并到合并输入流
		SequenceInputStream si = new SequenceInputStream(is01, is02) ;
		//创建高效字节输出流
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("合并.txt")) ;
		//读数据，一次读取一个字节数组
		byte[] buf = new byte[1024] ;
		int len = 0 ;
		while((len = si.read(buf)) != -1) {
			bos.write(buf, 0, len) ;
			bos.flush() ;
		} 
		//释放资源
		bos.close() ;
		si.close() ;
	}
	
	/**
	* @Name: test02
	* @Description: 测试一：合并多个输入流
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-16 下午10:22:21
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void test02() throws IOException {
		//创建Vector<InputStream>集合，以获取Enumeration<InputStream>对象
		Vector<InputStream> v = new Vector<InputStream>() ;
		//创建文件字节输入流1
		InputStream is01 = new FileInputStream("标准流.txt") ;
		//创建文件字节输入流2
		InputStream is02 = new FileInputStream("打印流.txt") ;
		//创建文件字节输入流3
		InputStream is03 = new FileInputStream("测试.txt") ;
		v.add(is01) ;
		v.add(is02) ;
		v.add(is03) ;
		//获取Enumeration<InputStream>对象
		Enumeration<InputStream> e= v.elements() ;
		//创建合并字节流对象
		SequenceInputStream sis = new SequenceInputStream(e) ;
		//创建高效字节写入流对象
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("合并.txt")) ;
		//读数据，一次读取一个字节数组
		byte[] buf = new byte[1024] ;
		int len = 0 ;
		while((len = sis.read(buf)) != -1) {
			bos.write(buf, 0, len) ;
			bos.flush() ;
		} 
		//释放资源
		bos.close() ;
		sis.close() ;
	}

}

















